"""
关于 page_object 的一些思考:
    将页面分为多个 page
        比如 , 首页page , 登录页page , 通讯录页page , 等
    每个 page 中 , 封装元素定位的方法 ,
        因为很多方法复用 , 因此基础方法抽取到 BasePage 中 , 各个 Page 继承 BasePage 就获取到了基础操作方法(元素定位,等待,输入,清空,切换等)
        每个 page 中 , 按照功能封装方法 ,
        --> 比如输入用户名密码登录的功能:
            1.定位用户名输入框 , 输入用户名
            2.定位密码输入框 , 输入密码
            3.点击登录按钮
        --> 添加个人信息:
            1.定位姓名输入框 , 输入姓名
            2.定位年龄输入框 , 输入年龄
            3.定位性别输入框 , 输入性别
            4.点击确认按钮
    当出现 page 交互 , 比如登录之后直接进入了首页 , 而首页是有 首页page的
        那么登录最后 , 则 return 首页page
    封装方法结束时 , 如果是提示信息(成功或者错误信息) , return 信息 , 方便断言

--->
    首页
        添加成员 , 添加应用 , 导入通讯录
    通讯录页
        添加成员 , 添加部门 , 删除部门 , 打标签
    协作页
        添加和删除日程 , 共享文档
    应用管理页
        应用1 , 应用2
    --->
        首页有添加成员 , 通讯录页也有添加成员 , 添加成员本身也不简单 , 因此可以将添加成员独立设计成page
        或者添加成员在功能上属于通讯录页 , 因此就放在通讯录页page中 , 首页只负责点击跳转(return 通讯录page)
        其他页面定义各自的方法 , 完成各自的操作 .
    --->
        测试用例类编写时候 , 先初始化 page , 然后通过 page 对象来调用 page 中的各个方法 .
        断言提示语
        断言元素是否加载或是否消失等.
"""
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as e_c
from time import sleep


def option():
    options = Options()
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--ignore-ssl-errors')
    options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
    return options


class BasePage:

    def __init__(self, driver: webdriver.Chrome = None):

        if not driver:
            self.driver = webdriver.Chrome(options=option())
        else:
            self.driver = driver

        self.driver.implicitly_wait(2)
        self.driver.maximize_window()
        self.wait = WebDriverWait(self.driver, 2)

    @staticmethod
    def sleep(seconds):
        sleep(seconds)

    def find_ele(self, locator: tuple):
        ele = self.driver.find_element(*locator)
        return ele

    def find_ele_visibility(self, locator: tuple):
        self.wait.until(e_c.visibility_of_element_located(locator))
        ele = self.driver.find_element(*locator)
        return ele

    def click_visibility_by_locator(self, locator: tuple):
        ele = self.find_ele_visibility(locator)
        ele.click()

    def save_screenshot(self, file_name):
        self.driver.save_screenshot(file_name)

    def close(self):
        sleep(2)
        self.driver.close()
        sleep(2)
        self.driver.quit()
